// import com.alibaba.druid.DbType;
// import com.alibaba.druid.sql.SQLUtils;
// import com.alibaba.druid.sql.ast.*;
// import com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr;
// import com.alibaba.druid.sql.ast.expr.SQLPropertyExpr;
// import com.alibaba.druid.sql.visitor.SQLASTVisitor;

// import java.util.ArrayList;
// import java.util.HashMap;
// import java.util.std::list;
// import java.util.std::map;
#pragma once
#include "../SQLStatementImpl.h"
#include "SQLCreateStatement.h"

class SQLDDLStatement;
class SQLAssignItem;
class SQLName;
class SQLCommentHint;
class SQLExpr;
class DbType;
class SQLASTVisitor;
class SQLObject;

class SQLCreateDatabaseStatement : public SQLStatementImpl, virtual public SQLCreateStatement
{
public:
  SQLName_ptr name;
  string_ptr  characterSet;
  string_ptr  collate;
  SQLCommentHint_list_ptr hints;
  BOOL_ptr ifNotExists;
  SQLExpr_ptr comment;
  SQLExpr_ptr location; // hive
  SQLAssignItem_list_ptr dbProperties;
  std::shared_ptr<std::map<string_ptr , SQLExpr_ptr>> options; // for ads
  string_ptr  user;

  SQLExpr_ptr password;                                                // drds
  SQLAssignItem_list_ptr storedOn;                             // drds
  std::shared_ptr<std::list<SQLAssignItem_list_ptr>> storedBy; // drds stored by
  SQLExpr_ptr storedAs;                                                // drds
  SQLExpr_ptr storedIn;                                                // drds

  // adb
  BOOL_ptr physical;

  SQLCreateDatabaseStatement();

  SQLCreateDatabaseStatement(DbType_ptr  dbType);
  SHAREDOBJECT(SQLCreateDatabaseStatement);

  void accept0(SQLASTVisitor_ptr visitor);

  SQLObject_list_ptr  getChildren();

  SQLName_ptr getName();

  void setName(SQLName_ptr name);

  string_ptr  getCharacterSet();

  void setCharacterSet(string_ptr  characterSet);

  string_ptr  getCollate();

  void setCollate(string_ptr  collate);

  SQLCommentHint_list_ptr getHints();

  void setHints(SQLCommentHint_list_ptr hints);

  BOOL_ptr isIfNotExists();

  void setIfNotExists(BOOL_ptr ifNotExists);

  SQLExpr_ptr getComment();

  string_ptr  getUser();

  void setUser(string_ptr  user);

  void setComment(SQLExpr_ptr x);

  SQLExpr_ptr getLocation();

  std::shared_ptr<std::map<string_ptr , SQLExpr_ptr>> getOptions();

  void setLocation(SQLExpr_ptr x);

  SQLAssignItem_list_ptr getDbProperties();

  void setOptions(std::shared_ptr<std::map<string_ptr , SQLExpr_ptr>> options);

  SQLAssignItem_list_ptr getStoredOn();

  std::shared_ptr<std::list<SQLAssignItem_list_ptr>> getStoredBy();

  SQLExpr_ptr getStoredAs();

  void setStoredAs(SQLExpr_ptr x);

  SQLExpr_ptr getStoredIn();

  void setStoredIn(SQLExpr_ptr x);

  SQLExpr_ptr getPassword();

  void setPassword(SQLExpr_ptr x);

  string_ptr  getDatabaseName();

  void setDatabase(string_ptr  database);

  string_ptr  getServer();

  BOOL_ptr setServer(string_ptr  server);

  BOOL_ptr isPhysical();

  void setPhysical(BOOL_ptr physical);

  SQLDDLStatement::DDLObjectType getDDLObjectType();
};
